package top.kaoshanji.p1ch02c;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

/**
 * 代码清单 p1ch02c-11：MethodHandle的参数绑定的基本用法
 * author kaoshanji
 * ^_^
 * create time 2025/1/2 20:08
 */
public class MethodHandleExample05 {

    private static final Logger logger = LogManager.getLogger(MethodHandleExample05.class);

    public static void main(String[] args) throws Throwable {
        logger.info("...代码清单 p1ch02c-11：MethodHandle的参数绑定的基本用法...");

        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodHandle mh = lookup.findVirtual(String.class, "length", MethodType.methodType(int.class));

        int len = (int)mh.invoke("Hello"); // 第一种，没有进行绑定，调用时需要传入 length 方法的接收者
        System.out.println(len);
        logger.info("...值是Hello，调用String#length方法：{}...", "Hello".length());


        mh = mh.bindTo("Hello World");
        len = (int)mh.invoke(); // 第二种，预先绑定了一个String类的对象，因此调用时不需要再指定
        System.out.println(len);
        logger.info("...值是Hello World，调用String#length方法：{}...", "Hello World".length());

    }

}
